package com.zm.common.aspect.annotaion;

import com.zm.common.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @version 1.0
 * @ ClassName MyPageHelperAspect
 * <p>分页切面
 * @ author 王志明
 * @ Date 2020/11/13 15:24
 */
@Aspect
@Slf4j
@Component
public class MyPageHelperAspect {
    /**
     * 定义拦截点
     */
    @Pointcut("execution(* com.zm.modules..*Mapper.list*(..))")
    public void myPageHelperAspect() {
    }

    /**
     * 环绕通知：
     * 环绕通知非常强大，可以决定目标方法是否执行，什么时候执行，执行时是否需要替换方法参数，执行完毕是否需要替换返回值。
     * 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型
     */
    @Around("myPageHelperAspect()")
    public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
        log.info("环绕通知的目标方法名：" + proceedingJoinPoint.getSignature().getName());
        Object[] args = proceedingJoinPoint.getArgs();
        PageHelper.startPage(args[1]);
        args[0] = PageHelper.getLocalPage();
        try {
            return proceedingJoinPoint.proceed(args);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return null;
    }


}
